1   /*
2    * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.
8    *
9    * This code is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12   * version 2 for more details (a copy is included in the LICENSE file that
13   * accompanied this code).
14   *
15   * You should have received a copy of the GNU General Public License version
16   * 2 along with this work; if not, write to the Free Software Foundation,
17   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18   *
19   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20   * or visit www.oracle.com if you need additional information or have any
21   * questions.
22   */
23  /*
24          A simple Java class definition that helps self-test the runtime
25          interpreter.  Used for getfield/putfield, invoke* opcodes and
26          their _quick variants.
27  
28          See src/share/java/runtime/selftest.c for details of the test
29          environment.
30  */
31  
32  /* Used to be sun/misc/SelfTest.java */
33  
34  interface UseAllBytecodesInterface
35  {
36      public void test_an_interface(int p1);
37  }
38  
39  public class UseAllBytecodes implements UseAllBytecodesInterface
40  {
41          public int i1, i2;
42          public float f1, f2;
43          public double d1, d2;
44          public long l1, l2;
45  
46          public static int si1, si2;
47          public static float sf1, sf2;
48          public static double sd1, sd2;
49          public static long sl1, sl2;
50  
51          public UseAllBytecodesInterface interfaceObject;
52  
53          public int multi[][][];
54  
55          public UseAllBytecodes()
56          {
57                  /*      This constructor is not intended to ever be run.  It is here
58                          to force CONSTANT_Methodref constants into the CP */
59                  set_i1(11);
60                  set_i2(22);
61                  set_f1(1.1f);
62                  set_f2(2.2f);
63                  set_d1(1.0);
64                  set_d2(2.0);
65                  set_l1(3);
66                  set_l2(4);
67  
68                  set_si1(33);
69                  set_si2(44);
70                  set_sf1(3.3f);
71                  set_sf2(4.4f);
72                  set_sd1(3.0);
73                  set_sd2(4.0);
74                  set_sl1(5);
75                  set_sl2(6);
76  
77                  test_areturn();
78                  test_athrow1();
79                  test_athrow2();
80                  test_athrow3();
81                  test_athrow4();
82  
83                  /*      This puts a CONSTANT_InterfaceMethodref into the CP */
84                  interfaceObject.test_an_interface(1234);
85  
86                  /*      This creates an array and puts it into the CP */
87                  multi = new int[2][3][4];
88          }
89  
90          public UseAllBytecodes(int p1)
91          {
92                  i1 = p1;
93                  i2 = 12345678;  /* This puts a CONSTANT_Integer into the CP */
94                  d1 = (double) p1;
95                  d2 = 1.2e234;   /* This puts a CONSTANT_Double into the CP */
96          }
97  
98          public UseAllBytecodes(int p1, int p2)
99          {
100                 i1 = p1;
101                 i2 = p2;
102         }
103 
104         /*      These methods should return something other than their
105                 arguments, so the self test can easily determine that
106                 the correct value was returned. */
107         public int set_i1(int p1)
108         {
109                 i1 = p1;
110                 return i1 + 1;
111         }
112 
113         public int set_i2(int p2)
114         {
115                 i2 = p2;
116                 return i2 + 1;
117         }
118 
119         public float set_f1(float p1)
120         {
121                 f1 = p1;
122                 return f1 + 1.0e34f;
123         }
124 
125         public float set_f2(float p2)
126         {
127                 f2 = p2;
128                 return f2 + 1.0e34f;
129         }
130 
131         public double set_d1(double p1)
132         {
133                 d1 = p1;
134                 return d1 + 1.0e234;
135         }
136 
137         public double set_d2(double p2)
138         {
139                 d2 = p2;
140                 return d2 + 1.0e234;
141         }
142 
143         public long set_l1(long p1)
144         {
145                 l1 = p1;
146                 return l1 + 1;
147         }
148 
149         public long set_l2(long p2)
150         {
151                 l2 = p2;
152                 return l2 + 1;
153         }
154 
155         public static void set_si1(int p1)
156         {
157                 si1 = p1;
158         }
159 
160         public static void set_si2(int p2)
161         {
162                 si2 = p2;
163         }
164 
165         public static void set_sf1(float p1)
166         {
167                 sf1 = p1;
168         }
169 
170         public static void set_sf2(float p2)
171         {
172                 sf2 = p2;
173         }
174 
175         public static void set_sd1(double p1)
176         {
177                 sd1 = p1;
178         }
179 
180         public static void set_sd2(double p2)
181         {
182                 sd2 = p2;
183         }
184 
185         public static void set_sl1(long p1)
186         {
187                 sl1 = p1;
188         }
189 
190         public static void set_sl2(long p2)
191         {
192                 sl2 = p2;
193         }
194 
195         public UseAllBytecodes test_areturn()
196         {
197                 return this;
198         }
199 
200         /*      This method does the same thing as set_i1.
201                 It is here to test the invokeinterface opcode. */
202         public void test_an_interface(int p1)
203         {
204                 i1 = p1;
205         }
206 
207         /*      The following 10 methods test various permutations of
208                 try-and-catch. */
209         public static void test_athrow1() throws NullPointerException
210         {
211                 try
212                 {
213                         si1 = -1;
214                         throw new NullPointerException();
215                 }
216                 catch (Exception e)
217                 {
218                         si1 = 1;
219                 }
220         }
221 
222         public static void test_athrow2()
223         {
224                 int i = 1;
225                 try
226                 {
227                         si1 = -1;
228                         test_athrow1();
229                 }
230                 catch (Exception e)
231                 {
232                         // This should *not* catch the exception;
233                         // should be caught in test_athrow1.
234                         si1 = i + 1;
235                 }
236         }
237 
238         public static void test_athrow3()
239         {
240                 int i = 1;
241                 try
242                 {
243                         // Ultimately throws NullPointerException
244                         si1 = -1;
245                         si2 = -1;
246                         test_athrow5();
247                 }
248                 catch (NullPointerException np)
249                 {
250                         si1 = i + 1;
251                 }
252                 catch (NoSuchMethodException e)
253                 {
254                         si2 = i + 1;
255                 }
256                 si1++;  // total is 3
257         }
258 
259         public static void test_athrow4()
260         {
261                 int i = 2;
262                 try
263                 {
264                         // Ultimately throws NoSuchMethodException
265                         si1 = -1;
266                         si2 = -1;
267                         test_athrow7();
268                 }
269                 catch (NullPointerException e)
270                 {
271                         si1 = i + 1;
272                 }
273                 catch (NoSuchMethodException nsm)
274                 {
275                         si2 = i + 1;
276                 }
277                 si2++;  // total is 4
278         }
279 
280         public static void test_throw_nosuchmethod() throws NoSuchMethodException
281         {
282                 throw new NoSuchMethodException();
283         }
284 
285         public static void test_throw_nullpointer() throws NullPointerException
286         {
287                 throw new NullPointerException();
288         }
289 
290         public static void test_athrow5() throws NullPointerException, NoSuchMethodException
291         {
292                 test_athrow6();
293         }
294 
295         public static void test_athrow6() throws NullPointerException, NoSuchMethodException
296         {
297                 test_throw_nullpointer();
298         }
299 
300         public static void test_athrow7() throws NullPointerException, NoSuchMethodException
301         {
302                 test_athrow8();
303         }
304 
305         public static void test_athrow8() throws NullPointerException, NoSuchMethodException
306         {
307                 test_throw_nosuchmethod();
308         }
309 }